#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：策略模式.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 23:19 
"""

"""
策略模式 (Strategy Pattern)
策略模式是一种行为型设计模式，它定义了一系列算法，并使得这些算法可以相互替换，从而使得算法的变化可以独立于使用算法的客户端而变化。

在 Python 中，策略模式通常通过定义一个抽象策略类以及一系列具体策略类来实现。以下是一个简单的示例：

在这个示例中，Strategy 是抽象策略类，定义了策略对象的接口。ConcreteStrategyA 和 ConcreteStrategyB 是具体策略类，实现了具体的策略算法。

Context 是上下文类，用于维护一个对策略对象的引用，并提供一个接口用于执行策略算法。

客户端代码创建了具体策略对象并传递给上下文对象，然后通过调用上下文对象的 execute_strategy 方法来执行相应的策略算法。

策略模式适用于需要在运行时动态地选择算法的情况，或者需要将算法的实现与使用算法的客户端分离的情况。通过使用策略模式，可以避免硬编码特定的算法，提高了代码的灵活性和可维护性。
"""

from abc import ABC, abstractmethod


# 抽象策略
class Strategy(ABC):
	@abstractmethod
	def execute(self, data):
		pass


# 具体策略A
class ConcreteStrategyA(Strategy):
	def execute(self, data):
		return f"具体策略A处理数据: {data}"


# 具体策略B
class ConcreteStrategyB(Strategy):
	def execute(self, data):
		return f"具体策略B处理数据: {data}"


# 上下文
class Context:
	def __init__(self, strategy):
		self._strategy = strategy

	def execute_strategy(self, data):
		return self._strategy.execute(data)


# 客户端代码
if __name__ == "__main__":
	strategy_a = ConcreteStrategyA()
	context_a = Context(strategy_a)
	result_a = context_a.execute_strategy("数据A")
	print(result_a)

	strategy_b = ConcreteStrategyB()
	context_b = Context(strategy_b)
	result_b = context_b.execute_strategy("数据B")
	print(result_b)
